package datos.gestores;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;
import java.util.Scanner;

import datos.entidades.Viaje;
import excepciones.ObjetoNoExisteExcepcion;

public class GestorDatosViaje implements GestorDatos {

	private File dataFile;
	private int cantViajes;
	private List <Viaje> viajes;
	
    public GestorDatosViaje () {
    	this.cantViajes = 0;
    	viajes = new ArrayList<Viaje>();
    }
    
    public GestorDatosViaje (String filePath) {
    	dataFile = new File(filePath);
    	this.cantViajes = 0;
    	viajes = new ArrayList<Viaje>();
    }

    public void set (int idx, Object viaje) {
    	this.viajes.set(idx, (Viaje) viaje);
    }

    public boolean remove (Object viaje) {
    	boolean exito;
    	
    	exito = this.viajes.remove(viaje);
    	if (exito == true)
    		setCantViajes(getCantViajes()-1);
    	return exito;
    }
    
    public void remove (int idx) {
    	this.viajes.remove(idx);
    	setCantViajes(getCantViajes()-1);
    }

    public Object get ( int idx) {
    	return (viajes.get(idx));
    }

    public boolean add (Object viaje) {
    	boolean exito;
    	
    	exito = this.viajes.add((Viaje)viaje);
    	if (exito == true)
    		setCantViajes(getCantViajes()+1);
    	
    	return exito;
    }

    public void listar () {
        Iterator<Viaje> iter = viajes.iterator();
        Viaje v;
        while (iter.hasNext()) {
        	v = (Viaje) iter.next();
          	System.out.println(v.getIdViaje() + " " + v.getIdCliente() + " " + v.getIdRuta());
        }
    }
    
    public void setCantViajes(int cantViajes) {
		this.cantViajes = cantViajes;
	}

	public int getCantViajes() {
		return cantViajes;
	}

    public void loadData () throws IOException {	 // Carga en memoria la info contenida en el archivo de rutas.
    	Scanner input = new Scanner (dataFile);        
    	setCantViajes(input.nextInt());		  
    	for (int i = 0 ; i < this.cantViajes ; i++ ) {
			Viaje nuevoViaje = new Viaje();
			nuevoViaje.setIdViaje(input.nextInt());
			nuevoViaje.setCosto(input.nextFloat());
			nuevoViaje.setIdRuta(input.nextInt());
			nuevoViaje.setTiempoMaximo(input.nextInt());
			//falta cargar los vehiculos asignados
			viajes.add(nuevoViaje);
    	}
    }
	 
    public void saveData () throws IOException {	// Graba en el archivo Viajes los datos almacenados en memoria.
    	PrintWriter out = new PrintWriter(new FileWriter(dataFile));
    	String s = "", costo = "";
		s = Integer.toString(this.cantViajes);
		out.println(s);
		s = "";
		out.println(s);
		for (int i = 0 ; i < this.cantViajes ; i++ ){
			costo = convertirParseFloat(Double.toString(viajes.get(i).getCosto()));
			s = s.concat(Integer.toString(viajes.get(i).getIdViaje())).concat(" ")
					  .concat(costo).concat(" ")
					  .concat(Integer.toString(viajes.get(i).getDuracion())).concat(" ")
					  .concat(Integer.toString(viajes.get(i).getIdRuta())).concat(" ")
					  .concat(Integer.toString(viajes.get(i).getTiempoMaximo())).concat(" ");
					  //falta guardar los vehiculos asignados.
			out.println(s);
			s = "";
		}
		out.close();
    }
    
    public int indexOf (Object viaje) {
    	int idx;
    	
    	idx = viajes.indexOf((Viaje) viaje);
    	
        return idx;
    }

    private String convertirParseFloat(String s) {
		char[] aux;
		int i = s.indexOf(".");
		aux = s.toCharArray();
		aux[i] = ',';
		s = String.copyValueOf(aux);
		return s;
    }	
    
    public int indexOf (int id ) throws ObjetoNoExisteExcepcion{		
    	int i = 0;
		int cantReg = getCantViajes();
    	while ((i < cantReg) && (((Viaje)get(i)).getIdViaje() != id )) i++;
		if (i < cantReg) return i;
		else throw new ObjetoNoExisteExcepcion ("No se encontro el viaje");
		
    }
    
}

